"""
宿舍内务计算
宿舍内务根据难度分为几个等级，每完成一项任务就可以累计对应等级的分数。等级和分数对应关系如下：
1级：擦桌子、椅子、窗户 - 对应1分
2级：扫地、拖地 - 对应2分
3级：扫厕所 - 对应3分
4级：帮全宿舍打饭 - 对应4分
5级：帮全宿舍签到 - 对应5分

编写一个Python程序，先读取“宿舍老大的内务记录.txt”文件，获取所有已填写的信息（字典格式），文件不存在则创建空字典用于记录
然后让用户输入自己完成的宿舍内务任务和完成次数。
将信息存储到字典中，以：{任务: 次数} 的格式存储，如果任务已经存在则累加次数，如果任务不存在则添加新的任务。
将任务记录更新到 “宿舍老大的内务记录.txt” 文件中，统计并显示用户总共完成每项任务的次数和总分。
程序结束

编程思路提示：
实现步骤：try方式读取文件 - eval转换为字典 - 接收用户输入 - 更新字典次数 - 计算分数 - str方式转换字典为字符串 - 保存到文件
使用with open来操作文件。
读取文件时，将字符串转换回字典，用 eval 函数。
写入文件前，将字典转换为字符串，用 str 函数。
任务和分数的对应字典用：
    task_scores = {'擦桌子': 1, '擦椅子': 1, '擦窗户': 1, '扫地': 2, '拖地': 2, '扫厕所': 3, '帮全宿舍打饭': 4, '帮全宿舍签到': 5}
"""
import os
import json

# 定义任务和分数的对应关系
task_scores = {
    '擦桌子': 1, '擦椅子': 1, '擦窗户': 1,
    '扫地': 2, '拖地': 2, '扫厕所': 3,
    '帮全宿舍打饭': 4, '帮全宿舍签到': 5
}

# 文件名
file_name = '宿舍老大的内务记录.txt'


def load_records():
    if os.path.exists(file_name):
        with open(file_name, 'r', encoding='utf-8') as file:
            try:
                return json.load(file)
            except json.JSONDecodeError:
                return {}
    else:
        return {}


def save_records(records):
    """保存记录到文件"""
    with open(file_name, 'w', encoding='utf-8') as file:
        json.dump(records, file, ensure_ascii=False, indent=4)


def update_member_tasks(records, member_name, tasks):
    """更新成员任务记录"""
    if member_name not in records:
        records[member_name] = {}

    for task, count in tasks.items():
        if task in records[member_name]:
            records[member_name][task] += count
        else:
            records[member_name][task] = count


def main():
    records = load_records()
    members = []
    print("请依次输入宿舍成员的姓名（输入 'ok' 完成输入）：")
    while True:
        member_name = input()
        if member_name.lower() == 'ok':
            break
        members.append(member_name)

    for member in members:
        tasks = {}
        print(f"\n{member}，请输入你完成的宿舍内务任务和完成次数（输入 'ok' 完成记录）：")
        while True:
            task = input(f"任务（输入任务名或 'ok' 完成）：")
            if task.lower() == 'ok':
                break
            if task in task_scores:
                try:
                    count = int(input(f"{task} 完成次数："))
                    if count > 0:
                        if task in tasks:
                            tasks[task] += count
                        else:
                            tasks[task] = count
                    else:
                        print("次数必须为正整数，请重新输入。")
                except ValueError:
                    print("输入无效，请输入正整数。")
            else:
                print(f"任务 {task} 不在任务列表中，请重新输入。")

        # 更新记录
        update_member_tasks(records, member, tasks)

    # 保存记录
    save_records(records)

    # 统计总分和显示宿舍老大
    total_scores = {}
    for member, member_tasks in records.items():
        score = sum(task_scores[task] * count for task, count in member_tasks.items())
        total_scores[member] = score

    # 找到分数最高的成员
    max_score = max(total_scores.values())
    dorm_leader = [member for member, score in total_scores.items() if score == max_score]

    # 显示结果
    print("\n每个成员的总分：")
    for member, score in total_scores.items():
        print(f"{member}：{score}分")

    print(f"\n宿舍老大是：{', '.join(dorm_leader)}（{max_score}分）")


if __name__ == "__main__":
    main()